#ifndef SEMANTIC_H
#define SEMANTIC_H
#include "symbol.h"

#define INIT_BY_LIST   1
#define INIT_BY_STRING  2


#define IS_BASE(var)    (!var->is_ptr && !var->is_arr)
#define NOT_BASE(var)   (var->is_ptr || var->is_arr)
#define IS_VOID(var)    (var->type == VOID)
#define IS_INT(var)     (var->type == INT)

#define IS_CHAR(var)    (var->type == CHAR)
#define IS_BASE_INT(var)  (IS_BASE(var) && IS_INT(var))
#define IS_BASE_CHAR(var)  (IS_BASE(var) && IS_CHAR(var))
#define IS_PTR(var)  (var->is_ptr)
#define IS_INT_PTR(var)  (IS_INT(var) && IS_PTR(var))
#define IS_CHAR_PTR(var)  (IS_CHAR(var) && IS_PTR(var))

bool var_type_exact_match(var_t *var1, var_t *var2);
bool fun_semantic_check_ok(fun_t *fun1, fun_t *fun2);
bool array_semantic_check(var_t *arr, int init_method, const char *str);
#endif